package transitarios;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import transitarios.api.IGestaoVeiculos;
import transitarios.entidades.comparator.VeiculoComparatorOrderByIndiceCargaUtil;
import transitarios.entidades.veiculos.Veiculo;

/**
 * @author Agostinho
 * 
 */
public class GestaoVeiculos implements IGestaoVeiculos, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * matricula, veiculo
	 */
	private Map<String, Veiculo> veiculos;

	public GestaoVeiculos() {
		this.veiculos = new TreeMap<String, Veiculo>();
	}

	public GestaoVeiculos(Map<String, Veiculo> veiculos) {
		this.veiculos = veiculos;
	}

	@Override
	public void adiciona(Veiculo entidade) {
		this.veiculos.put(entidade.getMatricula(), entidade);

	}

	@Override
	public int contagem() {

		return this.veiculos.size();
	}

	@Override
	public Veiculo devolve(String codigo) {
		return this.veiculos.get(codigo);
	}

	@Override
	public List<Veiculo> devolveTodos() {

		return new ArrayList<Veiculo>(this.veiculos.values());
	}

	@Override
	public List<Veiculo> devolveTodosOrderByIndiceCargaUtil() {
		List<Veiculo> veiculosResultList = new ArrayList<>(this.getVeiculos()
				.values());
		Collections.sort(veiculosResultList,
				new VeiculoComparatorOrderByIndiceCargaUtil());
		return veiculosResultList;
	}

	@Override
	public boolean existe(String codigo) {
		return (this.veiculos.get(codigo) == null ? false : true);
	}

	@Override
	public boolean existe(Veiculo p) {

		return (this.veiculos.get(p.getMatricula()) == null ? false : true);
	}

	/**
	 * @return the gestaoVeiculos
	 */
	// @Override
	protected Map<String, Veiculo> getVeiculos() {
		return this.veiculos;
	}

	@Override
	public void remove(String codigo) {
		this.veiculos.remove(codigo);

	}

	@Override
	public void removeVeiculo(Veiculo entidade) {

		this.veiculos.remove(entidade.getMatricula());

	}

	/**
	 * @param veiculos
	 *            the gestaoVeiculos to set
	 */
	// @Override
	protected void setVeiculos(Map<String, Veiculo> veiculos) {
		this.veiculos = veiculos;
	}

}
